
/**
 * <pre>
 * 数据类型
 * ├── 基本数据类型
 * │   ├── 数值类型
 * │   │   ├── 整数类型
 * │   │   │   ├── byte 1字节
 * │   │   │   ├── short 2字节
 * │   │   │   ├── int 4字节
 * │   │   │   └── long 8字节
 * │   │   ├── 字符类型 char 2字节
 * │   │   └── 浮点类型
 * │   │       ├── float 4字节
 * │   │       └── double 8字节
 * │   └── 布尔类型 boolean
 * └── 引用数据类型
 *     ├── 类
 *     ├── 接口
 *     ├── 数组
 *     └── null
 * </pre>
 * <p>编译：javac -encoding UTF-8 Variable.java
 * <p>运行：java Variable
 */
public class Variable {
    /**
     * 基本数据类型-整型
     */
    public static void intType() {
        // byte占用1字节
        byte b = 10;
        // short占用2字节
        short s = 10;
        // int占用4字节
        int a = 10;
        // long 占用8字节
        long l = 10L;

        // 八进制: 以0开头的整数值是八进制
        int octalValue = 013;
        // 十六进制：以0x或0X开头的整数值是十六进制
        int hexValue1 = 0x13;
        int hexValue2 = 0XAF;
        // 二进制：以0b或者0B开头
        int binValue1 = 0b11010100;
        byte binValue2 = 0B01101001;
    }

    /**
     * 基本数据类型-字符型
     */
    public static void charType() {
        // char占用2字节
        // 单个字符
        char c1 = 'A';
        char c2 = '中';
        // 转义字符
        char c3 = '\t';
        // unicode
        char c4 = '\u005d'; // 存放unicode
    }

    /**
     * 基本数据类型-浮点型
     */
    public static void floatType() {
        // float占用4字节
        float f = 1.1f;
        // double占用8字节
        double d1 = 1.1d;
        double d2 = 1.2;
        // 科学计数法
        double d3 = 5.12E2; // 5.12*10^2
        // 只有浮点类型的数值才能使用科学计数法形式表示。例如，51200是int类型，而512E2是浮点类型

        // 3个特殊的浮点数值
        // 正无穷 Double.POSITIVE_INFINITY or Float.POSITIVE_INFINITY
        // 负无穷 Double.NEGATIVE_INFINITY or Float.NEGATIVE_INFINITY
        // 非数 Double.NaN or Float.NaN
        // 所有的正无穷数值都是相等的，负无穷同理。而NaN不与任何数值相等，包括它自己NaN。
        double c = Double.POSITIVE_INFINITY;
        float d = Float.POSITIVE_INFINITY;
        System.out.println(c == d);
        System.out.println(0.0 / 0.0);
        System.out.println((0.0 / 0.0) == Float.NaN);
        System.out.println(6.0 / 0 == 555.0 / 0);
        System.out.println(-8.0 / 0);
//        System.out.println(0/0);  // 抛出异常
        // 只有浮点数除以0才可以得到正无穷大或负无穷大，整数除以0则会抛出异常。
    }

    /**
     * 基本数据类型-布尔类型
     */
    public static void booleanType() {
        // java规范并没有强制指定boolean类型变量所占用的内存空间。
        boolean b1 = true;

        // 使用boolean类型的值和字符串进行连接运算，boolean类型的值会自动转换为字符串
        String str = true + "";
        System.out.println(str);
    }

    public static void main(String[] args) {
        intType();
        charType();
        floatType();
        booleanType();

        // 数值中使用下划线分隔符
        int binVal = 0B1000_0001;
        double pi = 3.14_15_92_65_36;

        // 2. 引用数据类型
        // 2.1 类
        String s1 = "你好";
        // 2.2 接口
        // 2.3 数组
        int[] ii = {1, 2};
        double[] dd = new double[10];
    }
}
